
const wxConfig = require('./../../util/wx_x_config')
const request = require('request')
// const User = require('./../../util/user') //用户
const xml2js = require('xml2js')
const Util = require('./../../util/tool') // 工具方法
const card = require('./../../util/card') //会员卡表
const subject = require('./../../util/subject') //课程表
const Order = require('./../../util/purchasehistory') //订单历史 
const builder = new xml2js.Builder() // JSON->xml
const parser = new xml2js.Parser({
    explicitArray: false,
    ignoreAttrs: true
  }) //xml -> json

let OrderRouter = (router, opt) => {

// 支付成功的回调地址
router.post('/wxpaycallback', async (ctx, next) => {
  
  var bufferList = ctx.req._readableState.buffer;
  var head = bufferList.head;
  var tail = bufferList.tail, lastTime = '';
  
  // 拿到微信支付返回的数据 解析为json
  parser.parseString(head.data.toString('utf8'), async (err, res) => {
    var order = res.xml;
    
    //交给订单处理函数 对数据进行保存
    let orderInfo = await opt.find(Order, {out_trade_no: order.out_trade_no});
      orderInfo.time_end = order.time_end
      orderInfo.transaction_id = order.transaction_id
      orderInfo.trade_type = order.trade_type;
    var  pushData = null;
    


    if(order.result_code == 'SUCCESS') orderInfo.status = 100;

    var {goodsNameAll, goodsName, natatorium, natatoriumId, openId, goodsType, out_trade_no, status, nonce_str, count} = orderInfo
        pushData = {goodsNameAll, goodsName, natatorium, natatoriumId, openId, goodsType, out_trade_no, status,count, nonce_str}

    if (orderInfo.goodsType == "vipcard") {
      // console.log('tempOrder.goodsType', tempOrder)
        var timer = new Date(),
            day = timer.getDate();
        
      if(orderInfo.count == -1){
        
        if(/月卡/.test(orderInfo.goodsName)){
            timer.setDate(day + 30);
        } else {
          timer.setMonth(9)
          timer.setDate(30)
          timer.setHours(23)
        }
        orderInfo.lastTime = timer.getTime()
        pushData.lastTime = orderInfo.lastTime
      }
    
      // 把会员卡存放起来
      opt.create(card, pushData)
      .then(res => {
        console.log('添加会员成功', res);
      }, err => {
        console.log('添加会员失败', err);
      })
    } else {
      // 把培训科目存放起来
      opt.create(subject, pushData)
      .then(res => {
        console.log('addSubInfo', res);
      }, err => {
        console.log('addSubError', err);
      })
    }
   
    // console.log('pushData', pushData)
    //更新订单
    // opt.updata(User, {
    //         openid: orderInfo.openId
    //       }, {$push: pushData})
    // .then(res => {
    //   console.log('更新用户数据成功', res)
    // }, err => {
    //   console.log('更新用户数据失败', err)
    // })
    //更新订单
    opt.updata(Order, {
            out_trade_no: orderInfo.out_trade_no
          }, orderInfo)
    .then(res => {
      console.log('更新订单数据成功', res)
    }, err => {
      console.log('更新订单数据失败', err)
    })
  })


  ctx.body = `<xml>
            <return_code><![CDATA[SUCCESS]]></return_code>
            <return_msg><![CDATA[OK]]></return_msg>
          </xml>`;
})

function saveOrider(json) {
  return opt.insert(Order, json, (res, err) => {
    if (err) {
      return saveOrider(json)
    }

  })
}



// 同统一下单
router.post('/getCode', async(ctx, next) => {
  const data = ctx.request.body;
  var total_fee = data.total_fee,
    openid = data.openId;
  
  var spbill_create_ip = ctx.ip.replace(/::ffff:/, ''); // 获取客户端ip
  var body = data.goodsNameAll; // 商品描述
  // var notify_url = wxConfig.localUrl + '/wxpaycallback' // 支付成功的回调地址  可访问 不带参数
  var notify_url = wxConfig.url + '/wxpaycallback' // 支付成功的回调地址  可访问 不带参数
  var nonce_str = Util.generateMixed(); // 随机字符串
  var out_trade_no = wxConfig.getWxPayOrdrID(); // 商户订单号
  var total_fee = data.total_fee * 100; // 订单价格 单位是 分
  var timestamp = Math.round(new Date().getTime() / 1000); // 当前时间
  var key = wxConfig.Mch_key;

  // console.log('total_fee', total_fee)
  // total_fee = 1
  // 新建临时订单
  var tempOrder = data;
  tempOrder.timestamp = timestamp;
  tempOrder.out_trade_no = out_trade_no;
  tempOrder.status = 0
 
  var bodyData = '<xml>';
  bodyData += '<appid>' + wxConfig.AppID + '</appid>'; // 小程序ID
  bodyData += '<body>' + body + '</body>'; // 商品描述
  bodyData += '<mch_id>' + wxConfig.Mch_id + '</mch_id>'; // 商户号
  bodyData += '<nonce_str>' + nonce_str + '</nonce_str>'; // 随机字符串
  bodyData += '<notify_url>' + notify_url + '</notify_url>'; // 支付成功的回调地址 
  bodyData += '<openid>' + openid + '</openid>'; // 用户标识
  bodyData += '<out_trade_no>' + out_trade_no + '</out_trade_no>'; // 商户订单号
  bodyData += '<spbill_create_ip>' + spbill_create_ip + '</spbill_create_ip>'; // 终端IP
  bodyData += '<total_fee>' + total_fee + '</total_fee>'; // 总金额 单位为分
  bodyData += '<trade_type>JSAPI</trade_type>'; // 交易类型 小程序取值如下：JSAPI
  // 签名
  var sign = Util.paysignjsapi(
    wxConfig.AppID,
    body,
    wxConfig.Mch_id,
    nonce_str,
    notify_url,
    openid,
    out_trade_no,
    spbill_create_ip,
    total_fee,
    key
  );
  bodyData += '<sign>' + sign + '</sign>';
  bodyData += '</xml>';

  tempOrder.nonce_str = nonce_str
  tempOrder.openid = openid
  tempOrder.out_trade_no = out_trade_no
  tempOrder.total_fee = total_fee
   // console.log('tempOrder', tempOrder)
  // 把订单存放起来
  opt.insert(Order, tempOrder)
  .then(res => {
    console.log('addOrderInfo', res);
  }, err => {
    console.log('addOrderError', err);
  })

  
  tempOrder = null;

  // 微信小程序统一下单接口
  var urlStr = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
  var promise = new Promise(function(resolve, reject) {
    request({
      url: urlStr,
      method: 'POST',
      body: bodyData
    }, function(error, response, body) {

      if (!error && response.statusCode == 200) {
        var returnValue = {},
          json = {};
        parser.parseString(response.body, function(err, result) {

          if (result.xml.return_code == 'SUCCESS') {
            returnValue.msg = '操作成功';
            returnValue.status = '100';
            returnValue.out_trade_no = out_trade_no; // 商户订单号
            // 小程序 客户端支付需要 nonceStr,timestamp,package,paySign  这四个参数
            returnValue.nonceStr = result.xml.nonce_str; // 随机字符串
            returnValue.timestamp = timestamp.toString(); // 时间戳
            returnValue.package = 'prepay_id=' + result.xml.prepay_id; // 统一下单接口返回的 prepay_id 参数值
            returnValue.out_trade_no = out_trade_no; //商户订单号
            returnValue.paySign = Util.paysignjs(wxConfig.AppID, returnValue.nonceStr, returnValue.package, 'MD5', timestamp, key); // 签名
            resolve(JSON.stringify(returnValue))
          } else {
            returnValue.msg = result.xml.return_msg;
            returnValue.status = '102';
            reject(JSON.stringify(returnValue))

          }
        });

      }
    })
  })
  var result = await promise.then(
    val => {
      return val
    },
    err => {
      return err
    }
  )
  // console.log('统一下单接口返回', result);
  ctx.body = {
    res: '统一下单',
    status: 200,
    data: result
  }
})
}

module.exports = OrderRouter